/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.openide.explorer.view;
import java.beans.*;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.SwingUtilities;
import javax.swing.event.*;
import javax.swing.tree.*;
import javax.swing.*;
import org.openide.util.*;
import org.openide.nodes.Node;
import org.openide.nodes.NodeAdapter;
import org.openide.nodes.NodeListener;
import org.openide.nodes.NodeEvent;
import org.openide.nodes.NodeMemberEvent;
import org.openide.nodes.NodeReorderEvent;
import org.openide.nodes.Children;
/** Model for displaying the nodes in tree.
*
* @author Jaroslav Tulach
*/
public class NodeTreeModel extends DefaultTreeModel {
/** listener used to listen to changes in trees */
private transient Listener listener;
static final long serialVersionUID =1900670294524747212L;
/** Creates new NodeTreeModel
*/
public NodeTreeModel () {
super (VisualizerNode.EMPTY, true);
}
/** Creates new NodeTreeModel
* @param root the root of the model
*/
public NodeTreeModel (Node root) {
super (VisualizerNode.EMPTY, true);
setNode (root);
}
/** Changes the root of the model. This is thread safe method.
* @param root the root of the model
*/
public void setNode (final Node root) {
Mutex.EVENT.readAccess (new Runnable () {
public void run () {
VisualizerNode v = (VisualizerNode)getRoot ();
VisualizerNode nr = VisualizerNode.getVisualizer (null, root);
if (v == nr) {
// no change
return;
}
v.removeNodeModel (listener ());
nr.addNodeModel (listener ());
setRoot (nr);
}
});
}
/** Getter for the listener. Only from AWT-QUEUE.
*/
private Listener listener () {
if (listener == null) {
listener = new Listener (this);
}
return listener;
}
/**
* This sets the user object of the TreeNode identified by path
* and posts a node changed. If you use custom user objects in
* the TreeModel you'returngoing to need to subclass this and
* set the user object of the changed node to something meaningful.
*/
public void valueForPathChanged(TreePath path, Object newValue) {
Object o = path.getLastPathComponent();
if (o instanceof VisualizerNode) {
nodeChanged ((VisualizerNode)o);
return;
}
MutableTreeNode aNode = (MutableTreeNode)o;
aNode.setUserObject(newValue);
nodeChanged(aNode);
}
/** The listener */
private static final class Listener implements NodeModel {
/** weak reference to the model */
private Reference model;
/** Constructor.
*/
public Listener (NodeTreeModel m) {
model = new WeakReference (m);
}
/** Getter for the model or null.
*/
private NodeTreeModel get (VisualizerEvent ev) {
NodeTreeModel m = (NodeTreeModel)model.get ();
if (m == null && ev != null) {
ev.getVisualizer ().removeNodeModel (this);
return null;
}
return m;
}
/** Notification of children addded event. Modifies the list of nodes
* and fires info to all listeners.
*/
public void added (VisualizerEvent.Added ev) {
NodeTreeModel m = get (ev);
if (m == null) return;
m.nodesWereInserted (ev.getVisualizer (), ev.getArray ());
}
/** Notification that children has been removed. Modifies the list of nodes
* and fires info to all listeners.
*/
public void removed (VisualizerEvent.Removed ev) {
NodeTreeModel m = get (ev);
if (m == null) return;
m.nodesWereRemoved (ev.getVisualizer (), ev.getArray (), ev.removed.toArray ());
}
/** Notification that children has been reordered. Modifies the list of nodes
* and fires info to all listeners.
*/
public void reordered (VisualizerEvent.Reordered ev) {
NodeTreeModel m = get (ev);
if (m == null) return;
m.nodeStructureChanged (ev.getVisualizer ());
}
/** Update a visualizer (change of name, icon, description, etc.)
*/
public void update(VisualizerNode v) {
NodeTreeModel m = get (null);
if (m == null) return;
m.nodeChanged (v);
}
}
/*
public static void main (String[] args) {
Node n = org.openide.TopManager.getDefault ().getPlaces ().nodes ().repository ();
org.openide.windows.TopComponent c = new org.openide.windows.TopComponent ();
c.setLayout (new java.awt.BorderLayout ());
JTree tree = new JTree ();
NodeTreeModel m = new NodeTreeModel (n);
tree.setModel (m);
tree.setCellRenderer (new NodeRenderer ());
c.add ("Center", tree);
JList list = new JList ();
NodeListModel l = new NodeListModel (n);
l.setDepth (3);
list.setModel (l);
list.setCellRenderer (new NodeRenderer ());
c.add ("East", list);
c.open ();
}
*/
}
/*
* Log
* 6 Gandalf 1.5 11/26/99 Patrik Knakal
* 5 Gandalf 1.4 10/22/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 4 Gandalf 1.3 9/22/99 Petr Hamernik fixed #3808
* 3 Gandalf 1.2 9/14/99 Jaroslav Tulach Fires tree structure
* change on reorder.
* 2 Gandalf 1.1 8/27/99 Jaroslav Tulach List model can display
* more levels at once.
* 1 Gandalf 1.0 8/27/99 Jaroslav Tulach
* $
*/